<script lang="ts">
	import { goto } from '$app/navigation';
	import { toggleVisibility } from '$lib/helpers/forms';
	import LL from '$lib/i18n/i18n-svelte';
	import { pocketbase } from '$lib/stores/pocketbase';
	import { settingsPub } from '$lib/stores/settings';
	import type { SettingsPublic } from '$lib/types/settings';
	import { faArrowRight, faEye } from '@fortawesome/free-solid-svg-icons';
	import { onMount } from 'svelte';
	import Fa from 'svelte-fa';
	import toast from 'svelte-french-toast';

	let stepsCompleted = 0;
	let inputPassword: HTMLInputElement;
	let inputConfirm: HTMLInputElement;
	let form = {
		email: '',
		password: '',
		confirm: ''
	};

	onMount(() => {
		if ($settingsPub && !$settingsPub.setup_completed && $pocketbase.authStore.isValid) {
			$pocketbase.authStore.clear();
		}
	});

	async function register() {
		$pocketbase
			.send('/api/upsnap/init-superuser', {
				method: 'POST',
				body: {
					email: form.email,
					password: form.password,
					password_confirm: form.confirm
				}
			})
			.then(() => {
				$pocketbase
					.collection('settings_public')
					.getFirstListItem('')
					.then((data) => {
						settingsPub.set(data as SettingsPublic);
					});
				$pocketbase
					.collection('_superusers')
					.authWithPassword(form.email, form.password)
					.then(() => {
						stepsCompleted = 2;
					})
					.catch((err) => {
						if (err.data?.data?.identity?.message) {
							toast.error(err.data.data.identity.message);
							return;
						}
					});
			})
			.catch((err) => {
				if (err.data?.data?.passwordConfirm?.message) {
					toast.error($LL.toasts.passwords_missmatch());
				} else if (err.data?.data?.email?.message) {
					toast.error(err.data.data.email.message);
				} else {
					toast.error(err.message || err);
				}
			});
	}
</script>

<div class="mt-10 flex items-center justify-center">
	<div class="my-4 flex w-screen max-w-lg flex-col gap-16">
		<div class="card bg-base-200 shadow-sm">
			{#if stepsCompleted === 0 && $settingsPub?.setup_completed}
				<figure class="mx-auto w-72 pt-6"><img src="/gopher.svg" alt="Gopher" /></figure>
				<div class="card-body">
					<h2 class="card-title">{$LL.welcome.not_expected_title()}</h2>
					<p>{$LL.welcome.not_expected_desc()}</p>
					<div class="card-actions justify-end">
						<button class="btn btn-success" on:click={() => goto('/')}
							>{$LL.welcome.not_expected_back()}</button
						>
					</div>
				</div>
			{:else if stepsCompleted === 0}
				<figure class="mx-auto w-44 pt-6"><img src="/gopher.svg" alt="Gopher" /></figure>
				<div class="card-body">
					<h2 class="card-title">{$LL.welcome.step1_page_title()}</h2>
					<p>{$LL.welcome.step1_setup_desc()}</p>
					<div class="card-actions justify-end">
						<button class="btn btn-success" on:click={() => (stepsCompleted = 1)}
							>{$LL.welcome.step1_setup_btn_next()} <Fa icon={faArrowRight} /></button
						>
					</div>
				</div>
			{:else if stepsCompleted === 1}
				<div class="card-body">
					<div class="flex flex-row gap-4">
						<figure class="w-16"><img src="/gopher.svg" alt="Gopher" /></figure>
						<h2 class="card-title">{$LL.welcome.step2_page_title()}</h2>
					</div>
					<form class="w-full" on:submit|preventDefault={register}>
						<label class="label" for="email">
							<span>{$LL.welcome.step2_label_email()}</span>
						</label>
						<input id="email" type="email" class="input w-full" required bind:value={form.email} />
						<label class="label" for="password">
							<span>{$LL.welcome.step2_label_password()}</span>
							<span>{$LL.welcome.step2_label_min_chars()}</span>
						</label>
						<label class="relative block">
							<div
								class="absolute top-1/2 right-4 -translate-y-1/2 cursor-pointer"
								role="none"
								on:click={() => toggleVisibility(inputPassword)}
								on:keydown={() => toggleVisibility(inputPassword)}
							>
								<Fa icon={faEye} />
							</div>
							<input
								id="password"
								type="password"
								class="input w-full"
								minlength="10"
								maxlength="72"
								required
								bind:value={form.password}
								bind:this={inputPassword}
							/>
						</label>
						<label class="label" for="passwordConfirm">
							<span>{$LL.welcome.step2_label_password_confirm()}</span>
						</label>
						<label class="relative block">
							<div
								class="absolute top-1/2 right-4 -translate-y-1/2 cursor-pointer"
								role="none"
								on:click={() => toggleVisibility(inputConfirm)}
								on:keydown={() => toggleVisibility(inputConfirm)}
							>
								<Fa icon={faEye} />
							</div>
							<input
								id="confirm"
								type="password"
								class="input w-full"
								minlength="10"
								maxlength="72"
								required
								bind:value={form.confirm}
								bind:this={inputConfirm}
							/>
						</label>
						<div class="card-actions mt-4 justify-end">
							<button class="btn btn-success" type="submit"
								>{$LL.welcome.step2_btn_create()} <Fa icon={faArrowRight} /></button
							>
						</div>
					</form>
				</div>
			{:else if stepsCompleted === 2}
				<figure class="mx-auto w-72 pt-6"><img src="/gopher.svg" alt="Gopher" /></figure>
				<div class="card-body">
					<h2 class="card-title">{$LL.welcome.step3_page_title()}</h2>
					<p>{$LL.welcome.step3_page_desc()}</p>
					<div class="card-actions justify-end">
						<button class="btn btn-success" on:click={() => goto('/')}
							>{$LL.welcome.step3_btn_done()}</button
						>
					</div>
				</div>
			{/if}
		</div>
		{#if $settingsPub && !$settingsPub.setup_completed}
			<ul class="steps steps-horizontal">
				<li class="step step-success">{$LL.welcome.progress_step1()}</li>
				<li class="step" class:step-success={stepsCompleted > 0}>{$LL.welcome.progress_step2()}</li>
				<li class="step" class:step-success={stepsCompleted > 1}>{$LL.welcome.progress_step3()}</li>
			</ul>
		{/if}
	</div>
</div>
